home *** CD-ROM | disk | FTP | other *** search
/ HyperPC 2 / HyperPC 2 - Disc 1.iso / 18_厳選!オンラインソフト130 / アプリケーション / textcp75.lzh / vcsrc.lzh / Txtcpbd.c next >
C/C++ Source or Header  |  1997-11-23  |  8KB  |  358 lines

  1. #include <stdlib.h>
  2. #include <time.h>
  3. #include <mbctype.h>
  4. #include <windows.h>
  5. typedef struct{
  6.     char *Caption;
  7.     int PasteFlag;
  8.     void (*Func)(char *to , const char *from);
  9. }TagData;
  10.  
  11. char RetCode[]="\r\n";
  12.  
  13. int GetLine(char *to , const char *from)
  14. {
  15.     static const char *fr;
  16.     char *p;
  17.     int ret;
  18.     if(from) fr=from;
  19.     p=to;
  20.     ret=1;
  21.     while(1){
  22.         if(*fr==0){
  23.             *p=0;
  24.         break;
  25.     }
  26.         ret=0;
  27.     if(*fr==0xd){
  28.             fr++;
  29.             fr++;
  30.             *p=0;
  31.         break;
  32.     }
  33.     else{
  34.             *p=*fr;
  35.         p++;
  36.         fr++;
  37.     }
  38.     }
  39.     return ret;
  40. }
  41. void  StrInsert(char *t,const char *f)
  42. {
  43.     int k,i,l;      
  44.     register char *p,*q;
  45.     l=strlen(t);
  46.     k=strlen(f);
  47.     p=t+l;        
  48.     
  49.     q=t+l+k;
  50.     for(i=0;i<=l;i++){
  51.         *(q--)=*(p--);
  52.     }   
  53.     memcpy(t,f,k);
  54. }
  55. /*-------これ以降に処理関数を書いて下さい------------------------------
  56.     ToStrにクリップボードに入れる文字列を作るだけです。
  57.     ToStrの容量は300kbですので、越えないようにして下さい。
  58.     FromStrには現在のクリップボードの内容が入っていますので必要に応じて利用して下さい。
  59.     例のTimeStampでは、現在のクリップボードは無視しています。
  60.  
  61.   関数を作ったら下のテーブルに登録して下さい。
  62.   フォーマットは
  63.     メニューのキャプション , 動作フラグ , 処理関数 ,
  64.   です。
  65.   動作フラグは処理の前後の動作をしていします。下の定義から選んで下さい。
  66.     COPYにすると反転部分をクリップボードにコピーしてからそれをもとに処理を始めます。
  67.     PASTEにすると処理関数で作ったクリップボードのデータはすぐにペーストされます。
  68.     CUT_PASTEを指定すると、反転部分をカットしてからそれを本に処理を行い、その後ペーストされます。
  69.     よって反転部分を置換するような処理ができます。
  70.  テーブルの終わりにはストッパーをおいておいてください。削除しないように・・・。
  71. */
  72. static unsigned char *oomoji="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  73. static unsigned char *komoji="abcdefghijklmnopqrstuvwxyz";
  74. void ToOomoji(char *ToStr , const char *FromStr)
  75. {
  76.     const unsigned char *p=(const unsigned char *)FromStr;
  77.     unsigned char *q=(unsigned char *)ToStr;
  78.     while(*p){
  79.         if(_ismbblead(*p)){
  80.             unsigned char *to=oomoji , *fr=komoji;
  81.             while(*fr){
  82.                 if(memcmp(fr , p , 2)==0) break;
  83.                 fr+=2;
  84.                 to+=2;
  85.             }
  86.             if(*fr){
  87.                 memcpy(q , to , 2);
  88.             }
  89.             else{
  90.                 memcpy(q , p , 2);
  91.             }
  92.             q+=2;
  93.             p+=2;
  94.         }
  95.         else{
  96.             *q=(unsigned char)toupper((char)*p);
  97.             p++;
  98.             q++;
  99.         }
  100.     }
  101.     *q=0;
  102. }
  103. void ToKomoji(char *ToStr , const char *FromStr)
  104. {
  105.     const unsigned char *p=(const unsigned char *)FromStr;
  106.     unsigned char *q=(unsigned char *)ToStr;
  107.     while(*p){
  108.         if(_ismbblead(*p)){
  109.             unsigned char *to=komoji , *fr=oomoji;
  110.             while(*fr){
  111.                 if(memcmp(fr , p , 2)==0) break;
  112.                 fr+=2;
  113.                 to+=2;
  114.             }
  115.             if(*fr){
  116.                 memcpy(q , to , 2);
  117.             }
  118.             else{
  119.                 memcpy(q , p , 2);
  120.             }
  121.             q+=2;
  122.             p+=2;
  123.         }
  124.         else{
  125.             *q=(unsigned char)tolower((char)*p);
  126.             p++;
  127.             q++;
  128.         }
  129.     }
  130.     *q=0;
  131. }
  132. void Kakko(char *ToStr , const char *FromStr)
  133. {
  134.     wsprintf(ToStr , "(%s)" , FromStr);
  135. }
  136. void TimeStamp(char *ToStr , const char *FromStr)
  137. {
  138.     long tim;
  139.     struct tm *t;
  140.     tim=time(NULL);
  141.     t = localtime(&tim);
  142.     wsprintf(ToStr , "%02d/%02d/%02d %2d:%02d",t->tm_year , t->tm_mon+1 , t->tm_mday , t->tm_hour , t->tm_min);
  143. }
  144. void Swaping(char *ToStr , const char *FromStr)
  145. {
  146.     int end;
  147.     char buf[400];
  148.     ToStr[0]=0;
  149.     end=GetLine(buf , FromStr);
  150.     while(end==0){
  151.         char top[40] , eq[10], atai1[40] , atai2[40] , tail[40];
  152.     char *p , *q;
  153.     top[0]=0;
  154.     eq[0]=0;
  155.     atai1[0]=0;
  156.         atai2[0]=0;
  157.     tail[0]=0;
  158.  
  159.     p=top;
  160.     q=buf;
  161.     while(1){
  162.         if(*q!=' ' && *q!='\t'){
  163.         *p=0;
  164.         if(*q==0) goto MakeLine;
  165.         break;
  166.         }
  167.             
  168.         *p=*q;
  169.         p++;
  170.         q++;
  171.     }
  172.     p=atai1;
  173.     while(1){
  174.         if(*q==0){
  175.                 goto MakeLine;
  176.         }
  177.             if(*q=='='){
  178.         *p=0;
  179.         if(*(q-1)==':'){
  180.             *(p-1)=0;
  181.                     strcpy(eq , ":=");
  182.         }
  183.         else{
  184.                     strcpy(eq , "=");
  185.         }
  186.         q++;
  187.         break;
  188.         }
  189.         *p=*q;
  190.         p++;
  191.         q++;
  192.     }
  193.        
  194.     while(1){
  195.         if(*q!=' ' && *q!='\t'){
  196.         if(*q==0) goto MakeLine;
  197.         break;
  198.         }
  199.             q++;
  200.     }
  201.  
  202.     p=atai2;
  203.     while(1){
  204.         if(*q==0){
  205.         *p=0;
  206.                 goto MakeLine;
  207.         }
  208.             if(*q=='{' || *q==';' || *q=='/' || *q=='\''){
  209.         *p=0;
  210.         break;
  211.         }
  212.         *p=*q;
  213.         p++;
  214.         q++;
  215.     }
  216.         strcpy(tail , q);
  217. MakeLine:
  218.     strcat(ToStr , top);
  219.     strcat(ToStr , atai2);
  220.     strcat(ToStr , eq);
  221.     strcat(ToStr , atai1);
  222.     strcat(ToStr , tail);
  223.     strcat(ToStr , RetCode);
  224.  
  225.     end=GetLine(buf , NULL);
  226.     }
  227. }
  228. void Left(char *ToStr , const char *FromStr)
  229. {
  230.     int end;
  231.     char buf[400];
  232.     ToStr[0]=0;
  233.     end=GetLine(buf , FromStr);
  234.     while(end==0){
  235.     int k,i,j;
  236.     char *p;
  237.     i=0;
  238.     j=0;
  239.     p=buf;
  240.     while(1){
  241.             if(*p!=' ' && *p!='\t'){
  242.                 break;
  243.         }
  244.         if(*p==' '){
  245.                 j++;
  246.         if(j==8){
  247.                     i=i+8;
  248.             j=0;
  249.         }
  250.         }
  251.         if(*p=='\t'){
  252.                 i=i+8;
  253.         j=0;
  254.         }
  255.             p++;
  256.     }
  257.     i=i+j;
  258.         for(k=0;k<i-4;k++){
  259.             strcat(ToStr , " ");
  260.     }
  261.     strcat(ToStr , p);
  262.     strcat(ToStr , RetCode);
  263.     end=GetLine(buf , NULL);
  264.     }
  265. }
  266. void Right(char *ToStr , const char *FromStr)
  267. {
  268.     int end;
  269.     char buf[400];
  270.     ToStr[0]=0;
  271.     end=GetLine(buf , FromStr);
  272.     while(end==0){
  273.     char *p;
  274.     p=buf;
  275.     while(1){
  276.             if(*p!=' ' && *p!='\t'){
  277.                 break;
  278.         }
  279.             p++;
  280.     }
  281.     StrInsert(p , "    ");
  282.     strcat(ToStr , buf);
  283.     strcat(ToStr , RetCode);
  284.     end=GetLine(buf , NULL);
  285.     }
  286. }
  287. void Innyou(char *ToStr , const char *FromStr)
  288. {
  289.     int end;
  290.     char buf[400];
  291.     ToStr[0]=0;
  292.     end=GetLine(buf , FromStr);
  293.     while(end==0){
  294.         //ここに1行ごとの処理を書くといい  bufに1行が入ってくる
  295.     strcat(ToStr , ">");
  296.     strcat(ToStr , buf);
  297.     strcat(ToStr , RetCode);
  298.  
  299.     end=GetLine(buf , NULL);
  300.     }
  301. }
  302. /* 複数行処理のスケルトン
  303. void foo(char *ToStr , const char *FromStr)
  304. {
  305.     int end;
  306.     char buf[400];
  307.     ToStr[0]=0;
  308.     end=GetLine(buf , FromStr);
  309.     while(end==0){
  310.         //ここに1行ごとの処理を書くといい  bufに1行が入ってくる
  311.  
  312.         strcat(ToStr , buf);
  313.     strcat(ToStr , RetCode);
  314.  
  315.         end=GetLine(buf , NULL);
  316.     }
  317. }
  318. */
  319.  
  320. #define NOTHING 0
  321. #define COPY  1
  322. #define PASTE 2
  323. #define CUT_PASTE 3
  324.  
  325. TagData Data[]={
  326.     "引用マーク(&I)"       ,    COPY         ,  Innyou,
  327.     "大文字に変換(&B)"   ,    CUT_PASTE    ,  ToOomoji,
  328.     "小文字に変換(&S)"   ,    CUT_PASTE    ,  ToKomoji,
  329.     "インデント4つ右へ(&R)"   ,    CUT_PASTE    ,  Right,
  330.     "インデント4つ左へ(&L)"   ,    CUT_PASTE    ,  Left,
  331.     "()で囲む(&K)"       ,    CUT_PASTE    ,  Kakko,
  332.     "代入逆転(&X)"     ,    NOTHING      ,  Swaping,
  333.     "タイムスタンプ(&T)"     ,    PASTE        ,  TimeStamp , 
  334.     NULL               ,        0            ,  NULL        /*Stopper*/
  335. };
  336. /*-------ここまでを変更-----------------------------------------*/
  337. BOOL WINAPI DllMain(HINSTANCE hDLL , DWORD deReason , LPVOID lpRe)
  338. {
  339.     return TRUE;
  340. }
  341. int  _GetMenuData(int num , char *Caption , int *p)
  342. {
  343.     int end=0;
  344.     if(Data[num].Caption==NULL){
  345.         end=1;
  346.     }
  347.     else{
  348.         strcpy(Caption , Data[num].Caption);
  349.         *p=Data[num].PasteFlag;
  350.     }
  351.     return end;
  352. }
  353.  
  354. void _GetClipData(int n ,char *to , const char *from)
  355. {
  356.     Data[n].Func(to , from);
  357. }
  358.